package com.example.demo.controller;

// 引入相关的类和包

import com.example.demo.common.RestResult;
import com.example.demo.model.User;
import com.example.demo.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

// 允许跨域请求，允许所有来源，缓存时间为3600秒
@CrossOrigin(origins = "*", maxAge = 3600)
// 定义一个REST风格的控制器，所有请求映射到 "/api/auth" 路径下
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    // 自动注入 AuthService，用于处理认证相关的业务逻辑
    @Autowired
    private AuthService authService;

    // 处理用户登录请求，接收POST请求，路径为 /signin
    @PostMapping("/signin")
    public RestResult<Map<String, Object>> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
        try {
            // 调用 AuthService 的 authenticateUser 方法，传入用户名和密码，返回JWT令牌
            String jwt = authService.authenticateUser(loginRequest.getUsername(), loginRequest.getPassword());

            // 构建返回的响应内容，包含token和token类型
            Map<String, Object> response = new HashMap<>();
            response.put("token", jwt);
            response.put("type", "Bearer");

            // 返回成功状态码和响应体
            return RestResult.success(response);
        } catch (Exception e) {
            // 如果登录过程中出现异常，返回错误状态码和错误信息
            return RestResult.error(e.getMessage());
        }
    }

    /**
     * 处理用户注册请求 TODO 暂不开放
     *
     * @param signUpRequest
     * @return
     */
    // 处理用户注册请求，接收POST请求，路径为 /signup
    @PostMapping("/signup")
    @PreAuthorize("hasRole('ADMIN')")
    public RestResult<Map<String, Object>> registerUser(@Valid @RequestBody SignupRequest signUpRequest) {
        try {
            // 调用 AuthService 的 registerUser 方法注册新用户，传入用户名、邮箱和密码
            User user = authService.registerUser(
                    signUpRequest.getUsername(),
                    signUpRequest.getEmail(),
                    signUpRequest.getPassword());

            // 构建注册成功响应，包含提示信息和用户对象
            Map<String, Object> response = new HashMap<>();
            response.put("message", "User registered successfully!");
            response.put("user", user);

            // 返回成功状态码和响应体
            return RestResult.success(response);
        } catch (Exception e) {
            // 如果注册过程中出现异常，返回错误状态码和错误信息
            return RestResult.error(e.getMessage());
        }
    }

    // 内部静态类，用于接收登录请求的JSON数据（用户名和密码）
    public static class LoginRequest {
        private String username;
        private String password;

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }
    }

    // 内部静态类，用于接收注册请求的JSON数据（用户名、邮箱和密码）
    public static class SignupRequest {
        private String username;
        private String email;
        private String password;

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }
    }
}
